Antes de começar a fazer visualizações de dados devemos saber se nossos dados estão todos organizados e formatados corretamente, é raro que recebamos tudo organizado. Por isso é importante saber transformar os dados, o pacote dplyr, presente no tidyverse, ajuda bastante nisso e aprenderemos um pouco sobre isso nesse capítulo, usaremos o pacote nycflights13 para fazer os tratamentos.
data(flights)
flights
## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Podemos ver a estrutura do banco de dados por meio de dois comandos simples, head e str.
str(flights)
## tibble[,19] [336,776 x 19] (S3: tbl_df/tbl/data.frame)
## $ year : int [1:336776] 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
## $ month : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
## $ day : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
## $ dep_time : int [1:336776] 517 533 542 544 554 554 555 557 557 558 ...
## $ sched_dep_time: int [1:336776] 515 529 540 545 600 558 600 600 600 600 ...
## $ dep_delay : num [1:336776] 2 4 2 -1 -6 -4 -5 -3 -3 -2 ...
## $ arr_time : int [1:336776] 830 850 923 1004 812 740 913 709 838 753 ...
## $ sched_arr_time: int [1:336776] 819 830 850 1022 837 728 854 723 846 745 ...
## $ arr_delay : num [1:336776] 11 20 33 -18 -25 12 19 -14 -8 8 ...
## $ carrier : chr [1:336776] "UA" "UA" "AA" "B6" ...
## $ flight : int [1:336776] 1545 1714 1141 725 461 1696 507 5708 79 301 ...
## $ tailnum : chr [1:336776] "N14228" "N24211" "N619AA" "N804JB" ...
## $ origin : chr [1:336776] "EWR" "LGA" "JFK" "JFK" ...
## $ dest : chr [1:336776] "IAH" "IAH" "MIA" "BQN" ...
## $ air_time : num [1:336776] 227 227 160 183 116 150 158 53 140 138 ...
## $ distance : num [1:336776] 1400 1416 1089 1576 762 ...
## $ hour : num [1:336776] 5 5 5 5 6 5 6 6 6 6 ...
## $ minute : num [1:336776] 15 29 40 45 0 58 0 0 0 0 ...
## $ time_hour : POSIXct[1:336776], format: "2013-01-01 05:00:00" "2013-01-01 05:00:00" ...
Flights apresenta informações sobre todos os voos que saíram de Nova York em 2013 entre seus 3 aeroportos e destinos, horarios previstos e reais de saida e chegada, durações, entre outros.
Esse data frame é na verdade um tibble, df um pouco melhorados de um pacote presente no tidyverse.
Nesse capítulo abordaremos as 6 principais funções do dplyr que podem ser usadas para resolver a grande maioria dos problemas em relação à manipulação de dados.
filter() = Escolher observações baseadas em seus valores
arrange() = Reordenar Linhas
select() = Escolher variáveis pelo nome
mutate() = Criar novas variáveis com funções em relação a variáveis existentes
summarise() = Colapsar varios valores para apenas um sumário.
grouoby -> Todos podem ser usados juntos com group_by() que troca o escopo das funções para operar por grupos ao invés do dataset inteiro.
Todos funcionam de maneira similar, o primeiro argumento é um dataframe, os argumentos a seguir apontam o que deve ser feito com o df e o resultado é outro dataframe.
Vamos filtrar por exemplo o dataframe apenas por voos de 1 janeiro
filter(flights,month==1,day==1)
## # A tibble: 842 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ... with 832 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
A função nunca vai alterar o input, dessa maneira se quisermos salvar devemos fazer uma atribuição com o resultado.
jan1 <- filter(flights,month==1,day==1)
Se quiser imprimir, e fazer uma atribuição devemos colocar entre parentêses.
(dez25 <- filter(flights,month==12,day==25))
## # A tibble: 719 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 12 25 456 500 -4 649 651
## 2 2013 12 25 524 515 9 805 814
## 3 2013 12 25 542 540 2 832 850
## 4 2013 12 25 546 550 -4 1022 1027
## 5 2013 12 25 556 600 -4 730 745
## 6 2013 12 25 557 600 -3 743 752
## 7 2013 12 25 557 600 -3 818 831
## 8 2013 12 25 559 600 -1 855 856
## 9 2013 12 25 559 600 -1 849 855
## 10 2013 12 25 600 600 0 850 846
## # ... with 709 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Devemos fazer comparações para filtrar os dataframes para isso devemos saber fazer comparações, que retornam true ou false. Temos que lidar com problemas do ponto flutuante que pela limitação da mantissa, operações que são obvias retornam resultados errados. EX:
sqrt(2.0)^2.0 ==2.0
## [1] FALSE
1/49*49 == 1
## [1] FALSE
near(sqrt(2)^2,2)
## [1] TRUE
near(1/49*49,1)
## [1] TRUE
Voos de primeiro de Janeiro com duração maior que 5 horas.
filter(flights,day==1,month==1,air_time>300)
## # A tibble: 128 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 558 600 -2 924 917
## 2 2013 1 1 558 600 -2 923 937
## 3 2013 1 1 559 600 -1 854 902
## 4 2013 1 1 611 600 11 945 931
## 5 2013 1 1 622 630 -8 1017 1014
## 6 2013 1 1 627 630 -3 1018 1018
## 7 2013 1 1 628 630 -2 1016 947
## 8 2013 1 1 646 645 1 1023 1030
## 9 2013 1 1 651 655 -4 936 942
## 10 2013 1 1 655 700 -5 1037 1045
## # ... with 118 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Voos que não saíram do aeroporto JFK no natal
filter(flights)
## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Devemos saber o funcionamento dos operadores lógicos para as comparações, já temos essa noção, mas o livro aborda em um pedaço. No R temos & == and , | == or e ! == not.
Existe um operador utíl para substituir cadeias de or (OPERADOR %in% ). Exemplo:
all(na.omit(filter(flights,month==11 | month ==12)) == na.omit(filter(flights,month %in% c(11,12))))
## [1] TRUE
Podemos ver que o resultado foi o mesmo (tivemos que omitir os Na pois comparações com eles funcionam de maneira diferente).
Podemos lembrar das Leis de De Morgan para simplificar algumas buscas como por exemplo.
!(x & y ) == !x | !y e !(x|y) == !x & !y
Por exemplo, se quisessemos saber os voos que atrasaram menos de 2 horas para chegar ou para sair, poderiamos fazer assim.
filter(flights, !(arr_delay > 120 | dep_delay > 120))
## # A tibble: 316,050 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ... with 316,040 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
filter(flights, arr_delay <= 120 & dep_delay <= 120)
## # A tibble: 316,050 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ... with 316,040 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Comparações com NA quase sempre retornam NA, por isso é melhor evita-las. is.na() teste se um valor é NA. Filters vão ignorar valores que são false e NA, se quiser preservar NA deve ser pedido separadamente.
df <- tibble(x=c(1,NA,3))
filter(df,x>1)
## # A tibble: 1 x 1
## x
## <dbl>
## 1 3
filter(df,x>1 | is.na(x))
## # A tibble: 2 x 1
## x
## <dbl>
## 1 NA
## 2 3
filter(flights,arr_delay >= 120)
## # A tibble: 10,200 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 811 630 101 1047 830
## 2 2013 1 1 848 1835 853 1001 1950
## 3 2013 1 1 957 733 144 1056 853
## 4 2013 1 1 1114 900 134 1447 1222
## 5 2013 1 1 1505 1310 115 1638 1431
## 6 2013 1 1 1525 1340 105 1831 1626
## 7 2013 1 1 1549 1445 64 1912 1656
## 8 2013 1 1 1558 1359 119 1718 1515
## 9 2013 1 1 1732 1630 62 2028 1825
## 10 2013 1 1 1803 1620 103 2008 1750
## # ... with 10,190 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
filter(flights,dest == 'IAH' | dest == 'HOU')
## # A tibble: 9,313 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 623 627 -4 933 932
## 4 2013 1 1 728 732 -4 1041 1038
## 5 2013 1 1 739 739 0 1104 1038
## 6 2013 1 1 908 908 0 1228 1219
## 7 2013 1 1 1028 1026 2 1350 1339
## 8 2013 1 1 1044 1045 -1 1352 1351
## 9 2013 1 1 1114 900 134 1447 1222
## 10 2013 1 1 1205 1200 5 1503 1505
## # ... with 9,303 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
filter(flights,carrier %in% c('AA','DL','UA'))
## # A tibble: 139,504 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 554 600 -6 812 837
## 5 2013 1 1 554 558 -4 740 728
## 6 2013 1 1 558 600 -2 753 745
## 7 2013 1 1 558 600 -2 924 917
## 8 2013 1 1 558 600 -2 923 937
## 9 2013 1 1 559 600 -1 941 910
## 10 2013 1 1 559 600 -1 854 902
## # ... with 139,494 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
filter(flights,month >= 7 & month <= 9)
## # A tibble: 86,326 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 7 1 1 2029 212 236 2359
## 2 2013 7 1 2 2359 3 344 344
## 3 2013 7 1 29 2245 104 151 1
## 4 2013 7 1 43 2130 193 322 14
## 5 2013 7 1 44 2150 174 300 100
## 6 2013 7 1 46 2051 235 304 2358
## 7 2013 7 1 48 2001 287 308 2305
## 8 2013 7 1 58 2155 183 335 43
## 9 2013 7 1 100 2146 194 327 30
## 10 2013 7 1 100 2245 135 337 135
## # ... with 86,316 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
filter(flights,dep_delay <= 0,arr_delay >= 120 )
## # A tibble: 29 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 27 1419 1420 -1 1754 1550
## 2 2013 10 7 1350 1350 0 1736 1526
## 3 2013 10 7 1357 1359 -2 1858 1654
## 4 2013 10 16 657 700 -3 1258 1056
## 5 2013 11 1 658 700 -2 1329 1015
## 6 2013 3 18 1844 1847 -3 39 2219
## 7 2013 4 17 1635 1640 -5 2049 1845
## 8 2013 4 18 558 600 -2 1149 850
## 9 2013 4 18 655 700 -5 1213 950
## 10 2013 5 22 1827 1830 -3 2217 2010
## # ... with 19 more rows, and 11 more variables: arr_delay <dbl>, carrier <chr>,
## # flight <int>, tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
## # distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
filter(flights,dep_delay > 60,arr_delay <= 30)
## # A tibble: 211 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 3 1850 1745 65 2148 2120
## 2 2013 1 3 1950 1845 65 2228 2227
## 3 2013 1 6 1019 900 79 1558 1530
## 4 2013 1 7 1543 1430 73 1758 1735
## 5 2013 1 12 1706 1600 66 1949 1927
## 6 2013 1 12 1953 1845 68 2154 2137
## 7 2013 1 19 1456 1355 61 1636 1615
## 8 2013 1 21 1531 1430 61 1843 1815
## 9 2013 1 21 1648 1545 63 1939 1910
## 10 2013 10 5 1605 1500 65 1857 1827
## # ... with 201 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
filter(flights,dep_time >= 1 & dep_time <= 600)
## # A tibble: 9,344 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ... with 9,334 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
filter(flights, between(flights$dep_time,1,600))
## # A tibble: 9,344 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ... with 9,334 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
colSums(is.na(flights))
## year month day dep_time sched_dep_time
## 0 0 0 8255 0
## dep_delay arr_time sched_arr_time arr_delay carrier
## 8255 8713 0 9430 0
## flight tailnum origin dest air_time
## 0 2512 0 0 9430
## distance hour minute time_hour
## 0 0 0 0
8255 observações não tem informações sobre os horarios de saída. Existem outra variáveis com dados faltantes, o que faz sentido dado que algumas informações podem só ter sido inferidas dessa e do arrival.
Pois qualquer Número elevado a 0 vai ser 1.
Pois basta um True no Or para retornar True
Pois basta um dos valores ser False para pra retornar False.
Quando um resultado só possui uma possibilidade de resultado independente do número o retorno não é NA.
NA * 0 não é 0 pois 0 * 0 ^(-1) não é 0.
arrange ordena um dataframe baseado nos criterios escolhidos, passamos o data frame e depois os critérios que devem ser usados para essa ordenação, as variaveis subsequentes a uma anterior são usadas para desempatar o empate no valor anterior.
arrange(flights,year,month,day)
## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Voos ordenados pelos que mais atrasaram no ano, em minutos
arrange(flights,desc(dep_delay))
## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 9 641 900 1301 1242 1530
## 2 2013 6 15 1432 1935 1137 1607 2120
## 3 2013 1 10 1121 1635 1126 1239 1810
## 4 2013 9 20 1139 1845 1014 1457 2210
## 5 2013 7 22 845 1600 1005 1044 1815
## 6 2013 4 10 1100 1900 960 1342 2211
## 7 2013 3 17 2321 810 911 135 1020
## 8 2013 6 27 959 1900 899 1236 2226
## 9 2013 7 22 2257 759 898 121 1026
## 10 2013 12 5 756 1700 896 1058 2020
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Valores faltantes sempre são colocados no final. Exemplo:
flights %>% arrange(dep_time) %>% tail
## # A tibble: 6 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 9 30 NA 1842 NA NA 2019
## 2 2013 9 30 NA 1455 NA NA 1634
## 3 2013 9 30 NA 2200 NA NA 2312
## 4 2013 9 30 NA 1210 NA NA 1330
## 5 2013 9 30 NA 1159 NA NA 1344
## 6 2013 9 30 NA 840 NA NA 1020
## # ... with 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## # tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## # hour <dbl>, minute <dbl>, time_hour <dttm>
flights %>% arrange(desc(dep_time)) %>% tail
## # A tibble: 6 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 9 30 NA 1842 NA NA 2019
## 2 2013 9 30 NA 1455 NA NA 1634
## 3 2013 9 30 NA 2200 NA NA 2312
## 4 2013 9 30 NA 1210 NA NA 1330
## 5 2013 9 30 NA 1159 NA NA 1344
## 6 2013 9 30 NA 840 NA NA 1020
## # ... with 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## # tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## # hour <dbl>, minute <dbl>, time_hour <dttm>
arrange(flights,!is.na(dep_time),dep_time) # Poderia tambem apenas colocar desc para o primeiro argumento
## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 NA 1630 NA NA 1815
## 2 2013 1 1 NA 1935 NA NA 2240
## 3 2013 1 1 NA 1500 NA NA 1825
## 4 2013 1 1 NA 600 NA NA 901
## 5 2013 1 2 NA 1540 NA NA 1747
## 6 2013 1 2 NA 1620 NA NA 1746
## 7 2013 1 2 NA 1355 NA NA 1459
## 8 2013 1 2 NA 1420 NA NA 1644
## 9 2013 1 2 NA 1321 NA NA 1536
## 10 2013 1 2 NA 1545 NA NA 1910
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
arrange(flights,desc(is.na(dep_time)),dep_time)
## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 NA 1630 NA NA 1815
## 2 2013 1 1 NA 1935 NA NA 2240
## 3 2013 1 1 NA 1500 NA NA 1825
## 4 2013 1 1 NA 600 NA NA 901
## 5 2013 1 2 NA 1540 NA NA 1747
## 6 2013 1 2 NA 1620 NA NA 1746
## 7 2013 1 2 NA 1355 NA NA 1459
## 8 2013 1 2 NA 1420 NA NA 1644
## 9 2013 1 2 NA 1321 NA NA 1536
## 10 2013 1 2 NA 1545 NA NA 1910
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
arrange(flights,desc(dep_delay)) # Atrasado
## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 9 641 900 1301 1242 1530
## 2 2013 6 15 1432 1935 1137 1607 2120
## 3 2013 1 10 1121 1635 1126 1239 1810
## 4 2013 9 20 1139 1845 1014 1457 2210
## 5 2013 7 22 845 1600 1005 1044 1815
## 6 2013 4 10 1100 1900 960 1342 2211
## 7 2013 3 17 2321 810 911 135 1020
## 8 2013 6 27 959 1900 899 1236 2226
## 9 2013 7 22 2257 759 898 121 1026
## 10 2013 12 5 756 1700 896 1058 2020
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
arrange(flights,dep_delay) # Adiantado
## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 12 7 2040 2123 -43 40 2352
## 2 2013 2 3 2022 2055 -33 2240 2338
## 3 2013 11 10 1408 1440 -32 1549 1559
## 4 2013 1 11 1900 1930 -30 2233 2243
## 5 2013 1 29 1703 1730 -27 1947 1957
## 6 2013 8 9 729 755 -26 1002 955
## 7 2013 10 23 1907 1932 -25 2143 2143
## 8 2013 3 30 2030 2055 -25 2213 2250
## 9 2013 3 2 1431 1455 -24 1601 1631
## 10 2013 5 5 934 958 -24 1225 1309
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
arrange(flights,desc(distance/air_time))
## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 5 25 1709 1700 9 1923 1937
## 2 2013 7 2 1558 1513 45 1745 1719
## 3 2013 5 13 2040 2025 15 2225 2226
## 4 2013 3 23 1914 1910 4 2045 2043
## 5 2013 1 12 1559 1600 -1 1849 1917
## 6 2013 11 17 650 655 -5 1059 1150
## 7 2013 2 21 2355 2358 -3 412 438
## 8 2013 11 17 759 800 -1 1212 1255
## 9 2013 11 16 2003 1925 38 17 36
## 10 2013 11 16 2349 2359 -10 402 440
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
arrange(flights,desc(distance))
## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 857 900 -3 1516 1530
## 2 2013 1 2 909 900 9 1525 1530
## 3 2013 1 3 914 900 14 1504 1530
## 4 2013 1 4 900 900 0 1516 1530
## 5 2013 1 5 858 900 -2 1519 1530
## 6 2013 1 6 1019 900 79 1558 1530
## 7 2013 1 7 1042 900 102 1620 1530
## 8 2013 1 8 901 900 1 1504 1530
## 9 2013 1 9 641 900 1301 1242 1530
## 10 2013 1 10 859 900 -1 1449 1530
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
arrange(flights,distance)
## # A tibble: 336,776 x 19
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 7 27 NA 106 NA NA 245
## 2 2013 1 3 2127 2129 -2 2222 2224
## 3 2013 1 4 1240 1200 40 1333 1306
## 4 2013 1 4 1829 1615 134 1937 1721
## 5 2013 1 4 2128 2129 -1 2218 2224
## 6 2013 1 5 1155 1200 -5 1241 1306
## 7 2013 1 6 2125 2129 -4 2224 2224
## 8 2013 1 7 2124 2129 -5 2212 2224
## 9 2013 1 8 2127 2130 -3 2304 2225
## 10 2013 1 9 2126 2129 -3 2217 2224
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Selecione apenas as variáveis de interesse de um dataset pelo seu nome. Se quisermos apenas a data, número do voo, companhia aérea e número do avião.
select(flights,year,month,day,carrier,flight,tailnum)
## # A tibble: 336,776 x 6
## year month day carrier flight tailnum
## <int> <int> <int> <chr> <int> <chr>
## 1 2013 1 1 UA 1545 N14228
## 2 2013 1 1 UA 1714 N24211
## 3 2013 1 1 AA 1141 N619AA
## 4 2013 1 1 B6 725 N804JB
## 5 2013 1 1 DL 461 N668DN
## 6 2013 1 1 UA 1696 N39463
## 7 2013 1 1 B6 507 N516JB
## 8 2013 1 1 EV 5708 N829AS
## 9 2013 1 1 B6 79 N593JB
## 10 2013 1 1 AA 301 N3ALAA
## # ... with 336,766 more rows
Podemos selecionar todas as colunas entre duas colunas (inclusas).
select(flights,year:dep_time)
## # A tibble: 336,776 x 4
## year month day dep_time
## <int> <int> <int> <int>
## 1 2013 1 1 517
## 2 2013 1 1 533
## 3 2013 1 1 542
## 4 2013 1 1 544
## 5 2013 1 1 554
## 6 2013 1 1 554
## 7 2013 1 1 555
## 8 2013 1 1 557
## 9 2013 1 1 557
## 10 2013 1 1 558
## # ... with 336,766 more rows
Selecionar todas colunas menos algumas.
select(flights,-(year:dep_time))
## # A tibble: 336,776 x 15
## sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight
## <int> <dbl> <int> <int> <dbl> <chr> <int>
## 1 515 2 830 819 11 UA 1545
## 2 529 4 850 830 20 UA 1714
## 3 540 2 923 850 33 AA 1141
## 4 545 -1 1004 1022 -18 B6 725
## 5 600 -6 812 837 -25 DL 461
## 6 558 -4 740 728 12 UA 1696
## 7 600 -5 913 854 19 B6 507
## 8 600 -3 709 723 -14 EV 5708
## 9 600 -3 838 846 -8 B6 79
## 10 600 -2 753 745 8 AA 301
## # ... with 336,766 more rows, and 8 more variables: tailnum <chr>,
## # origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
## # minute <dbl>, time_hour <dttm>
select(flights,-c(year,month,day))
## # A tibble: 336,776 x 16
## dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier
## <int> <int> <dbl> <int> <int> <dbl> <chr>
## 1 517 515 2 830 819 11 UA
## 2 533 529 4 850 830 20 UA
## 3 542 540 2 923 850 33 AA
## 4 544 545 -1 1004 1022 -18 B6
## 5 554 600 -6 812 837 -25 DL
## 6 554 558 -4 740 728 12 UA
## 7 555 600 -5 913 854 19 B6
## 8 557 600 -3 709 723 -14 EV
## 9 557 600 -3 838 846 -8 B6
## 10 558 600 -2 753 745 8 AA
## # ... with 336,766 more rows, and 9 more variables: flight <int>,
## # tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## # hour <dbl>, minute <dbl>, time_hour <dttm>
Existem varias funções auxiliares para serem usadas com select.
starts_with(“abc”): matches names that begin with “abc”.
ends_with(“xyz”): matches names that end with “xyz”.
contains(“ijk”): matches names that contain “ijk”.
matches(“(.)\1”): selects variables that match a regular expression. This one matches any variables that contain repeated characters. You’ll learn more about regular expressions in strings.
num_range(“x”, 1:3): matches x1, x2 and x3.
select(flights,starts_with('arr')) # O mesmo padrão serve para os outros
## # A tibble: 336,776 x 2
## arr_time arr_delay
## <int> <dbl>
## 1 830 11
## 2 850 20
## 3 923 33
## 4 1004 -18
## 5 812 -25
## 6 740 12
## 7 913 19
## 8 709 -14
## 9 838 -8
## 10 753 8
## # ... with 336,766 more rows
Select pode ser usado para renomear variáveis, mas pelo fato de não manter as variáveis não escolhidas, faz mais sentido usar rename() na maioria das situações
select(flights,ano = year)
## # A tibble: 336,776 x 1
## ano
## <int>
## 1 2013
## 2 2013
## 3 2013
## 4 2013
## 5 2013
## 6 2013
## 7 2013
## 8 2013
## 9 2013
## 10 2013
## # ... with 336,766 more rows
rename(flights,ano=year)
## # A tibble: 336,776 x 19
## ano month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Usar select em conjunto com everything se quiser colocar apenas algumas colunas na primeira posição.
select(flights,origin,dest,everything())
## # A tibble: 336,776 x 19
## origin dest year month day dep_time sched_dep_time dep_delay arr_time
## <chr> <chr> <int> <int> <int> <int> <int> <dbl> <int>
## 1 EWR IAH 2013 1 1 517 515 2 830
## 2 LGA IAH 2013 1 1 533 529 4 850
## 3 JFK MIA 2013 1 1 542 540 2 923
## 4 JFK BQN 2013 1 1 544 545 -1 1004
## 5 LGA ATL 2013 1 1 554 600 -6 812
## 6 EWR ORD 2013 1 1 554 558 -4 740
## 7 EWR FLL 2013 1 1 555 600 -5 913
## 8 LGA IAD 2013 1 1 557 600 -3 709
## 9 JFK MCO 2013 1 1 557 600 -3 838
## 10 LGA ORD 2013 1 1 558 600 -2 753
## # ... with 336,766 more rows, and 10 more variables: sched_arr_time <int>,
## # arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
select(flights,dep_time,dep_delay,arr_time,arr_delay)
## # A tibble: 336,776 x 4
## dep_time dep_delay arr_time arr_delay
## <int> <dbl> <int> <dbl>
## 1 517 2 830 11
## 2 533 4 850 20
## 3 542 2 923 33
## 4 544 -1 1004 -18
## 5 554 -6 812 -25
## 6 554 -4 740 12
## 7 555 -5 913 19
## 8 557 -3 709 -14
## 9 557 -3 838 -8
## 10 558 -2 753 8
## # ... with 336,766 more rows
select(flights,dep_time:arr_delay,-starts_with('sched'))
## # A tibble: 336,776 x 4
## dep_time dep_delay arr_time arr_delay
## <int> <dbl> <int> <dbl>
## 1 517 2 830 11
## 2 533 4 850 20
## 3 542 2 923 33
## 4 544 -1 1004 -18
## 5 554 -6 812 -25
## 6 554 -4 740 12
## 7 555 -5 913 19
## 8 557 -3 709 -14
## 9 557 -3 838 -8
## 10 558 -2 753 8
## # ... with 336,766 more rows
select(flights,contains(c('arr_','dep_')),-contains('sched'))
## # A tibble: 336,776 x 4
## arr_time arr_delay dep_time dep_delay
## <int> <dbl> <int> <dbl>
## 1 830 11 517 2
## 2 850 20 533 4
## 3 923 33 542 2
## 4 1004 -18 544 -1
## 5 812 -25 554 -6
## 6 740 12 554 -4
## 7 913 19 555 -5
## 8 709 -14 557 -3
## 9 838 -8 557 -3
## 10 753 8 558 -2
## # ... with 336,766 more rows
# Podemos listar todos que não queremos.
select(flights,dep_time:arr_delay)[c(1,3,4,6)]
## # A tibble: 336,776 x 4
## dep_time dep_delay arr_time arr_delay
## <int> <dbl> <int> <dbl>
## 1 517 2 830 11
## 2 533 4 850 20
## 3 542 2 923 33
## 4 544 -1 1004 -18
## 5 554 -6 812 -25
## 6 554 -4 740 12
## 7 555 -5 913 19
## 8 557 -3 709 -14
## 9 557 -3 838 -8
## 10 558 -2 753 8
## # ... with 336,766 more rows
flights[c(4,6,7,9)]
## # A tibble: 336,776 x 4
## dep_time dep_delay arr_time arr_delay
## <int> <dbl> <int> <dbl>
## 1 517 2 830 11
## 2 533 4 850 20
## 3 542 2 923 33
## 4 544 -1 1004 -18
## 5 554 -6 812 -25
## 6 554 -4 740 12
## 7 555 -5 913 19
## 8 557 -3 709 -14
## 9 557 -3 838 -8
## 10 558 -2 753 8
## # ... with 336,766 more rows
select(flights,year,carrier,year) # Apenas uma vez é retornada (Na posição da primeira)
## # A tibble: 336,776 x 2
## year carrier
## <int> <chr>
## 1 2013 UA
## 2 2013 UA
## 3 2013 AA
## 4 2013 B6
## 5 2013 DL
## 6 2013 UA
## 7 2013 B6
## 8 2013 EV
## 9 2013 B6
## 10 2013 AA
## # ... with 336,766 more rows
vars <- c("year", "month", "day", "dep_delay", "arr_delay")
select(flights,any_of(vars))
## # A tibble: 336,776 x 5
## year month day dep_delay arr_delay
## <int> <int> <int> <dbl> <dbl>
## 1 2013 1 1 2 11
## 2 2013 1 1 4 20
## 3 2013 1 1 2 33
## 4 2013 1 1 -1 -18
## 5 2013 1 1 -6 -25
## 6 2013 1 1 -4 12
## 7 2013 1 1 -5 19
## 8 2013 1 1 -3 -14
## 9 2013 1 1 -3 -8
## 10 2013 1 1 -2 8
## # ... with 336,766 more rows
Serve para ajudar na seleção com vetores de caracteres externos, seleciona todas colunas que o nome aparece no vetor, caso um nome do vetor não apareça no df, esse nome apenas é descartado e os outros ainda são selecionados. all_of é parecida mas se um dos nomes do vetor não está no df, retorna erro e nada é selecionado.
select(flights,contains('TIME'))
## # A tibble: 336,776 x 6
## dep_time sched_dep_time arr_time sched_arr_time air_time time_hour
## <int> <int> <int> <int> <dbl> <dttm>
## 1 517 515 830 819 227 2013-01-01 05:00:00
## 2 533 529 850 830 227 2013-01-01 05:00:00
## 3 542 540 923 850 160 2013-01-01 05:00:00
## 4 544 545 1004 1022 183 2013-01-01 05:00:00
## 5 554 600 812 837 116 2013-01-01 06:00:00
## 6 554 558 740 728 150 2013-01-01 05:00:00
## 7 555 600 913 854 158 2013-01-01 06:00:00
## 8 557 600 709 723 53 2013-01-01 06:00:00
## 9 557 600 838 846 140 2013-01-01 06:00:00
## 10 558 600 753 745 138 2013-01-01 06:00:00
## # ... with 336,766 more rows
O resultado me surpreende pois letras maiúsculas e minúsculas foram interpretadas igualmente ao procurar. A starts_with , ends_with , contains e matches contem o argumento ignore.case que como é default é TRUE, ele faz com que não haja distinção entre maiúsculas e minúsculas. Podemos alterer isso.
select(flights,contains('TIME',ignore.case = FALSE)) # Nenhuma coluna encontrada
## # A tibble: 336,776 x 0
Mutate adiciona novas colunas ao final do Dataset, para facilitar a visualização, vamos criar um dataset reduzido para trabalhar
flights_aux <- select(flights,year:day,ends_with('delay'),distance,air_time)
mutate(flights_aux,gain = dep_delay - arr_delay, speed = distance/air_time * 60)
## # A tibble: 336,776 x 9
## year month day dep_delay arr_delay distance air_time gain speed
## <int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2013 1 1 2 11 1400 227 -9 370.
## 2 2013 1 1 4 20 1416 227 -16 374.
## 3 2013 1 1 2 33 1089 160 -31 408.
## 4 2013 1 1 -1 -18 1576 183 17 517.
## 5 2013 1 1 -6 -25 762 116 19 394.
## 6 2013 1 1 -4 12 719 150 -16 288.
## 7 2013 1 1 -5 19 1065 158 -24 404.
## 8 2013 1 1 -3 -14 229 53 11 259.
## 9 2013 1 1 -3 -8 944 140 5 405.
## 10 2013 1 1 -2 8 733 138 -10 319.
## # ... with 336,766 more rows
Podemos criar outras variáveis a partir das já existente, lembre que assim como as outras funções,o data frame não foi alterado, o optput é um novo conjunto que caso desejado deve ser salvo em uma variável.
No uso da função é possivel se referir em colunas que acabaram de ser criadas.
mutate(flights_aux,
gain = dep_delay - arr_delay,
hours = air_time / 60,
gain_per_hour = gain/hours)
## # A tibble: 336,776 x 10
## year month day dep_delay arr_delay distance air_time gain hours
## <int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2013 1 1 2 11 1400 227 -9 3.78
## 2 2013 1 1 4 20 1416 227 -16 3.78
## 3 2013 1 1 2 33 1089 160 -31 2.67
## 4 2013 1 1 -1 -18 1576 183 17 3.05
## 5 2013 1 1 -6 -25 762 116 19 1.93
## 6 2013 1 1 -4 12 719 150 -16 2.5
## 7 2013 1 1 -5 19 1065 158 -24 2.63
## 8 2013 1 1 -3 -14 229 53 11 0.883
## 9 2013 1 1 -3 -8 944 140 5 2.33
## 10 2013 1 1 -2 8 733 138 -10 2.3
## # ... with 336,766 more rows, and 1 more variable: gain_per_hour <dbl>
Se o seu objetivo é manter apenas asnovas variáveis, deve usar transmute
transmute(flights_aux,
gain = dep_delay - arr_delay,
hours = air_time / 60,
gain_per_hour = gain/hours)
## # A tibble: 336,776 x 3
## gain hours gain_per_hour
## <dbl> <dbl> <dbl>
## 1 -9 3.78 -2.38
## 2 -16 3.78 -4.23
## 3 -31 2.67 -11.6
## 4 17 3.05 5.57
## 5 19 1.93 9.83
## 6 -16 2.5 -6.4
## 7 -24 2.63 -9.11
## 8 11 0.883 12.5
## 9 5 2.33 2.14
## 10 -10 2.3 -4.35
## # ... with 336,766 more rows
Existem várias funções que podem ser usadas em conjunto com mutate, a condição é que elas possam receber um vetor como input e um vetor com mesmo tamanho de output. Exemplos:
Operadores Aritiméticos: + - * / ^
Modulares Aritiméticos: %/% (Divisão por Inteiro) %% (Resto)
Modulares são utéis para dividir inteiros, por exeplo:
transmute(flights,dep_time,horas = dep_time %/% 100, minutos = dep_time %% 100)
## # A tibble: 336,776 x 3
## dep_time horas minutos
## <int> <dbl> <dbl>
## 1 517 5 17
## 2 533 5 33
## 3 542 5 42
## 4 544 5 44
## 5 554 5 54
## 6 554 5 54
## 7 555 5 55
## 8 557 5 57
## 9 557 5 57
## 10 558 5 58
## # ... with 336,766 more rows
Logs são utéis para dados em diversas ordens de grandeza.
lead e lag premite que sejam comparados os valores com seu antterior ou próximo, útil para analisar quando um valor muda em séries temporais, etc. Podemos aplicar com mutate para criar novos dados.
x <- c(1,1,1,1,2,3,4,4,4,4,4,5,5,5,5,5); lag(x)
## [1] NA 1 1 1 1 2 3 4 4 4 4 4 5 5 5 5
x - lag(x) # 'Empurra' os valores para frente
## [1] NA 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0
x - lead(x) # 'Puxa' os valore para trás
## [1] 0 0 0 -1 -1 -1 0 0 0 0 -1 0 0 0 0 NA
dados <- tibble(x = c(1,2,3,4,5,6,7,8,9))
mutate(dados,somacumulativa = cumsum(x),produtocum = cumprod(x),mincum = cummin(x),maxcum= cummax(x),mediacumulativa = cummean(x)) # Nesse caso o produto ficou com o mesmo valor do fatorial por serem todos numeros a partir do 0 em sequência.
## # A tibble: 9 x 6
## x somacumulativa produtocum mincum maxcum mediacumulativa
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 1 1 1 1 1
## 2 2 3 2 1 2 1.5
## 3 3 6 6 1 3 2
## 4 4 10 24 1 4 2.5
## 5 5 15 120 1 5 3
## 6 6 21 720 1 6 3.5
## 7 7 28 5040 1 7 4
## 8 8 36 40320 1 8 4.5
## 9 9 45 362880 1 9 5
transmute(flights_aux,distancia_maior_1000 = distance >1000)
## # A tibble: 336,776 x 1
## distancia_maior_1000
## <lgl>
## 1 TRUE
## 2 TRUE
## 3 TRUE
## 4 TRUE
## 5 FALSE
## 6 FALSE
## 7 TRUE
## 8 FALSE
## 9 FALSE
## 10 FALSE
## # ... with 336,766 more rows
transmute(flights_aux,distance,rankdist = min_rank(distance)) %>% arrange(distance)
## # A tibble: 336,776 x 2
## distance rankdist
## <dbl> <int>
## 1 17 1
## 2 80 2
## 3 80 2
## 4 80 2
## 5 80 2
## 6 80 2
## 7 80 2
## 8 80 2
## 9 80 2
## 10 80 2
## # ... with 336,766 more rows
transmute(flights,distance,rankdist= min_rank(desc(distance))) %>% arrange(desc(distance))
## # A tibble: 336,776 x 2
## distance rankdist
## <dbl> <int>
## 1 4983 1
## 2 4983 1
## 3 4983 1
## 4 4983 1
## 5 4983 1
## 6 4983 1
## 7 4983 1
## 8 4983 1
## 9 4983 1
## 10 4983 1
## # ... with 336,766 more rows
Caso min rank não seja o desejado existem outras opções, apresentadas a seguir:
y <- c(1,2,2,NA,3,4)
min_rank(y)
## [1] 1 2 2 NA 4 5
row_number(y)
## [1] 1 2 3 NA 4 5
dense_rank(y)
## [1] 1 2 2 NA 3 4
percent_rank(y)
## [1] 0.00 0.25 0.25 NA 0.75 1.00
cume_dist(y)
## [1] 0.2 0.6 0.6 NA 0.8 1.0
transmute(flights,dep_time,sched_dep_time,
minutos_dep= dep_time %/% 100 *60 + dep_time %%100 ,
minutos_dep_programado = sched_dep_time %/% 100 *60 + sched_dep_time %%100)
## # A tibble: 336,776 x 4
## dep_time sched_dep_time minutos_dep minutos_dep_programado
## <int> <int> <dbl> <dbl>
## 1 517 515 317 315
## 2 533 529 333 329
## 3 542 540 342 340
## 4 544 545 344 345
## 5 554 600 354 360
## 6 554 558 354 358
## 7 555 600 355 360
## 8 557 600 357 360
## 9 557 600 357 360
## 10 558 600 358 360
## # ... with 336,766 more rows
transmute(flights,dep_time,arr_time,air_time,time_errado = arr_time-dep_time)
## # A tibble: 336,776 x 4
## dep_time arr_time air_time time_errado
## <int> <int> <dbl> <int>
## 1 517 830 227 313
## 2 533 850 227 317
## 3 542 923 160 381
## 4 544 1004 183 460
## 5 554 812 116 258
## 6 554 740 150 186
## 7 555 913 158 358
## 8 557 709 53 152
## 9 557 838 140 281
## 10 558 753 138 195
## # ... with 336,766 more rows
Os resultados são diferentes pois os horarios estão em formados errados, para consertar temos que converter os horarios em minutos, isso funcionara para todos dados menos os que chegaram um dia depois, para computar esses casos teriamos que assumir um dia arbitrario com valor 0 para ser o começo do contador desse banco de dados e fazer a conta com isso (sabendo o dia de saida e de chegada do voo). Além disso voos que mudarem de fuso horarios tambem terão valores errados. Mas vale ser feito mesmo assim.
transmute(flights %>% filter(arr_time >600),
dep_time,
arr_time,
dep_time2= dep_time %/% 100 *60 + dep_time %%100,
arr_time2 = arr_time %/% 100 *60 + arr_time %%100,
air_time, air_time_calc = arr_time2 - dep_time2)
## # A tibble: 316,283 x 6
## dep_time arr_time dep_time2 arr_time2 air_time air_time_calc
## <int> <int> <dbl> <dbl> <dbl> <dbl>
## 1 517 830 317 510 227 193
## 2 533 850 333 530 227 197
## 3 542 923 342 563 160 221
## 4 544 1004 344 604 183 260
## 5 554 812 354 492 116 138
## 6 554 740 354 460 150 106
## 7 555 913 355 553 158 198
## 8 557 709 357 429 53 72
## 9 557 838 357 518 140 161
## 10 558 753 358 473 138 115
## # ... with 316,273 more rows
O método seria esse, porem o air time é calculado apenas como tempo voando mesmo, enquanto o departure e arrival, o tempo de saída e chegada considerando a abertura e fechamento das portas, dessa maneira precisariamos das variaveis de tempo que o aviao ficou parado e taxiou para calcular corretamente.
transmute(flights,
saida_real_min= dep_time %/% 100 *60 + dep_time %%100,
saida_plan_min= sched_dep_time %/% 100 *60 + sched_dep_time %%100,
dep_delay,
delay_calc = saida_real_min - saida_plan_min)
## # A tibble: 336,776 x 4
## saida_real_min saida_plan_min dep_delay delay_calc
## <dbl> <dbl> <dbl> <dbl>
## 1 317 315 2 2
## 2 333 329 4 4
## 3 342 340 2 2
## 4 344 345 -1 -1
## 5 354 360 -6 -6
## 6 354 358 -4 -4
## 7 355 360 -5 -5
## 8 357 360 -3 -3
## 9 357 360 -3 -3
## 10 358 360 -2 -2
## # ... with 336,766 more rows
Fazendo os ajustes corretos o horarío sai corretamente.
transmute(flights,dep_delay,rk = min_rank(desc(dep_delay))) %>% filter(rk <= 10) %>% arrange(rk)
## # A tibble: 10 x 2
## dep_delay rk
## <dbl> <int>
## 1 1301 1
## 2 1137 2
## 3 1126 3
## 4 1014 4
## 5 1005 5
## 6 960 6
## 7 911 7
## 8 899 8
## 9 898 9
## 10 896 10
Retorna erro pois operações entre vetores, devem conter vetores de comprimento igual.
O R fornece seno, cosseno, tangente, arccosseno, arcseno e arctangente. Essas são as principais, porem mais são fornecidas e muitas outras provavelmente podem ser encontradas por meio de pacotes.
A ultima função principal é summarise(), ela condensa o dataframe em apenas uma linha:
summarise(flights,delay=mean(dep_delay,na.rm=T))
## # A tibble: 1 x 1
## delay
## <dbl>
## 1 12.6
Média de atraso dos voos.
Fica muito mais útil quando combinado com group.by(). Muda a análise do dataset inteiro para grupos, dessa forma quando usamos os verbos do dplyr nos datasets agrupados essas funções automaticamente se aplicaram em cada grupo.
groupb <- group_by(flights,year,month,day)
summarise(groupb,delay=mean(dep_delay,na.rm=T))
## `summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.
## # A tibble: 365 x 4
## # Groups: year, month [12]
## year month day delay
## <int> <int> <int> <dbl>
## 1 2013 1 1 11.5
## 2 2013 1 2 13.9
## 3 2013 1 3 11.0
## 4 2013 1 4 8.95
## 5 2013 1 5 5.73
## 6 2013 1 6 7.15
## 7 2013 1 7 5.42
## 8 2013 1 8 2.55
## 9 2013 1 9 2.28
## 10 2013 1 10 2.84
## # ... with 355 more rows
Combinadas, essas duas funções geram funções que são extremamente usadas com o dplyr. grouped summaries.
Vamos supor que você deseja ver a relação entre a distancia do voo e o tempo de médio de atraso. Um código assim funcionaria.
grupo <- group_by(flights,dest)
delay <- summarise(grupo,
count = n(), # n() fornece o tamanho do grupo atual
dist = mean(distance,na.rm=T),
delay = mean(arr_delay,na.rm=T))
delay <- filter(delay,count > 20,dest != 'HNL') # Estamos removendo Honolulu devido a grande distância
graf <- ggplot(delay,aes(dist,delay)) + geom_point(aes(size=count,tooltip=dest),alpha=1/3) + geom_smooth(se= F)
ggplotly(graf)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
O código tem 3 passos , Primeiro o agrupamento dados, depois a sumarização dos dados, por último um filtro para remover os locais que tinham poucos poucos voos e remover Honolulu que tem o dobro da distancia dos outros aeroportos. Esse código tem a inconveniência de ter que nomear variáveis intermediarias que não são necessarias.
Agora usaremos o operador pipe %>% para fazer o mesmo processo.
delays <- flights %>% group_by(dest) %>%
summarise(count=n(),dist = mean(distance,na.rm = T),delay = mean(arr_delay,na.rm=T)) %>%
filter(count>20,dest != 'HNL')
delays
## # A tibble: 96 x 4
## dest count dist delay
## <chr> <int> <dbl> <dbl>
## 1 ABQ 254 1826 4.38
## 2 ACK 265 199 4.85
## 3 ALB 439 143 14.4
## 4 ATL 17215 757. 11.3
## 5 AUS 2439 1514. 6.02
## 6 AVL 275 584. 8.00
## 7 BDL 443 116 7.05
## 8 BGR 375 378 8.03
## 9 BHM 297 866. 16.9
## 10 BNA 6333 758. 11.8
## # ... with 86 more rows
Isso torna o código mais legível, voce pode fazer uma leitura em forma de verbos imperativos e com o pipe sendo um então. Selecione o df flights então agrupe baseado no destino, agora tire a distancia media e delay médio de cada grupo, agora remova os grupos menores que 20 e honolulu.
Valores missing em um conjunto de dados, quando são somados retornam missing, dessa maneira em operações de agregação é necessário fornecer o argumento na.rm para remover esses valores antes da conta.
sum(c(NA,2,3,4,5,6,7)); mean(c(NA,3,4,5,6,7))
## [1] NA
## [1] NA
sum(c(NA,2,3,4,5,6,7),na.rm=T); mean(c(NA,3,4,5,6,7),na.rm=T)
## [1] 27
## [1] 5
Podemos filtrar um dataset com os voos que não foram cancelados por exemplo
naocancelados <- flights %>% filter(!is.na(dep_delay) & !is.na(arr_delay))
naocancelados %>% group_by(dest) %>% summarise(count=n(),dist=mean(dep_delay),delay=mean(arr_delay))
## # A tibble: 104 x 4
## dest count dist delay
## <chr> <int> <dbl> <dbl>
## 1 ABQ 254 13.7 4.38
## 2 ACK 264 6.45 4.85
## 3 ALB 418 23.4 14.4
## 4 ANC 8 12.9 -2.5
## 5 ATL 16837 12.4 11.3
## 6 AUS 2411 13.0 6.02
## 7 AVL 261 8.15 8.00
## 8 BDL 412 17.7 7.05
## 9 BGR 358 19.2 8.03
## 10 BHM 269 29.0 16.9
## # ... with 94 more rows
Quando uma agregação é feita, é bom salvar uma variável com a contagem de observações no grupo ou a contagem de observações não vazias no grupo, dessa maneira saberemos o tamanho amostral e teremos noção do tamanho amostral. Por exemplo, vamos analisar os aviões baseado no numero da cauda que tem os maiores atrasos.
delays <- naocancelados %>% group_by(tailnum) %>% summarise(delay=mean(arr_delay))
ggplot(delays,aes(delay)) + geom_freqpoly(binwidth=10)
Parece que existem alguns aviões que tem tempo médio de atraso de 300 min, mas existem mais coisas por tras disso, se fizemos um gráfico de dispersão de tempo de atraso por número de voos:
delays <- naocancelados %>% group_by(tailnum) %>% summarise(delay=mean(arr_delay),n=n())
ggplot(delays) + geom_point(aes(x=n,y=delay),alpha=1/10)
Podemos perceber que os únicos aviões que tem um tempo médio de atraso muito alto são os que voaram poucas vezes.
Pode ser útil combinar agregações com subsets lógicos. Temos a média de atrasos de todos os voos na primeira variável e a média de atraso somente dos voos que atrasaram na segunda variável.
naocancelados %>% group_by(year,month,day) %>%
summarise(avg_delay = mean(arr_delay),avg_delay_pos = mean(arr_delay[arr_delay > 0]))
## `summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.
## # A tibble: 365 x 5
## # Groups: year, month [12]
## year month day avg_delay avg_delay_pos
## <int> <int> <int> <dbl> <dbl>
## 1 2013 1 1 12.7 32.5
## 2 2013 1 2 12.7 32.0
## 3 2013 1 3 5.73 27.7
## 4 2013 1 4 -1.93 28.3
## 5 2013 1 5 -1.53 22.6
## 6 2013 1 6 4.24 24.4
## 7 2013 1 7 -4.95 27.8
## 8 2013 1 8 -3.23 20.8
## 9 2013 1 9 -0.264 25.6
## 10 2013 1 10 -5.90 27.3
## # ... with 355 more rows
naocancelados %>% group_by(carrier) %>% summarise(n = n(),media_atr = mean(dep_delay),desvio_atraso = sd(dep_delay)) %>% arrange(media_atr)
## # A tibble: 16 x 4
## carrier n media_atr desvio_atraso
## <chr> <int> <dbl> <dbl>
## 1 US 19831 3.74 27.9
## 2 HA 342 4.90 74.1
## 3 AS 709 5.83 31.4
## 4 AA 31947 8.57 37.4
## 5 DL 47658 9.22 39.7
## 6 MQ 25037 10.4 39.0
## 7 UA 57782 12.0 35.5
## 8 OO 29 12.6 43.1
## 9 VX 5116 12.8 44.0
## 10 B6 54049 13.0 38.4
## 11 9E 17294 16.4 45.5
## 12 WN 12044 17.7 43.2
## 13 FL 3175 18.6 52.5
## 14 YV 544 18.9 49.2
## 15 EV 51108 19.8 46.4
## 16 F9 681 20.2 58.4
naocancelados %>% group_by(hour) %>% summarise(n=n(),atr_men_75 = quantile(dep_delay,0.75),atr_max = max(dep_delay)) %>% arrange(hour)
## # A tibble: 19 x 4
## hour n atr_men_75 atr_max
## <dbl> <int> <dbl> <dbl>
## 1 5 1940 1 201
## 2 6 25447 0 786
## 3 7 22475 0 898
## 4 8 26734 1 911
## 5 9 19931 1 1301
## 6 10 16370 3 788
## 7 11 15689 4 437
## 8 12 17744 7 636
## 9 13 19457 11 533
## 10 14 21022 13 602
## 11 15 23082 18 483
## 12 16 22045 21 1126
## 13 17 23667 23 896
## 14 18 21072 25 1014
## 15 19 20507 32 1137
## 16 20 16061 34 878
## 17 21 10503 37 800
## 18 22 2558 27 276
## 19 23 1042 17 245
75% dos aviões não atrasam as 6 e 7 da manhã, e no geral os horarios de manhã tem menos aviões atrasados, enquanto 25% dos voos atrasam mais que meia hora as 19 horas da noite.
naocancelados %>% group_by(year,month,day) %>% summarise(primeiro = first(dep_time),ultimo = last(dep_time))
## `summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.
## # A tibble: 365 x 5
## # Groups: year, month [12]
## year month day primeiro ultimo
## <int> <int> <int> <int> <int>
## 1 2013 1 1 517 2356
## 2 2013 1 2 42 2354
## 3 2013 1 3 32 2349
## 4 2013 1 4 25 2358
## 5 2013 1 5 14 2357
## 6 2013 1 6 16 2355
## 7 2013 1 7 49 2359
## 8 2013 1 8 454 2351
## 9 2013 1 9 2 2252
## 10 2013 1 10 3 2320
## # ... with 355 more rows
Podem ser usadas de maneira complementar com filtros e ranks. Para filtrar com todas variáveis e a observação completa em cada linha.
naocancelados %>% group_by(year,month,day) %>% mutate(r = min_rank(desc(dep_time))) %>% filter(r %in% range(r))
## # A tibble: 770 x 20
## # Groups: year, month, day [365]
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 2356 2359 -3 425 437
## 3 2013 1 2 42 2359 43 518 442
## 4 2013 1 2 2354 2359 -5 413 437
## 5 2013 1 3 32 2359 33 504 442
## 6 2013 1 3 2349 2359 -10 434 445
## 7 2013 1 4 25 2359 26 505 442
## 8 2013 1 4 2358 2359 -1 429 437
## 9 2013 1 4 2358 2359 -1 436 445
## 10 2013 1 5 14 2359 15 503 445
## # ... with 760 more rows, and 12 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>,
## # r <int>
r contem o rank de cada voo pelo horario, se filtramos apenas onde r = 1 e r = max(r) (por meio de range) temos o primeiro e último voo.
naocancelados %>% group_by(dest) %>% summarise(carriers = n_distinct(carrier),voos = n()) %>% arrange(desc(carriers))
## # A tibble: 104 x 3
## dest carriers voos
## <chr> <int> <int>
## 1 ATL 7 16837
## 2 BOS 7 15022
## 3 CLT 7 13674
## 4 ORD 7 16566
## 5 TPA 7 7390
## 6 AUS 6 2411
## 7 DCA 6 9111
## 8 DTW 6 9031
## 9 IAD 6 5383
## 10 MSP 6 6929
## # ... with 94 more rows
Existem diversos locais que apenas uma companhia aérea leva e diversos que varias levam.
O dplyr fornece um simplificador se tudo que deseja são counts.
naocancelados %>% count(carrier)
## # A tibble: 16 x 2
## carrier n
## <chr> <int>
## 1 9E 17294
## 2 AA 31947
## 3 AS 709
## 4 B6 54049
## 5 DL 47658
## 6 EV 51108
## 7 F9 681
## 8 FL 3175
## 9 HA 342
## 10 MQ 25037
## 11 OO 29
## 12 UA 57782
## 13 US 19831
## 14 VX 5116
## 15 WN 12044
## 16 YV 544
Voce pode ainda fornecer uma variável peso. Poderia usar isso para medir a quantidade de milhas que um avião voou.
naocancelados %>% count(tailnum,wt=distance)
## # A tibble: 4,037 x 2
## tailnum n
## <chr> <dbl>
## 1 D942DN 3418
## 2 N0EGMQ 239143
## 3 N10156 109664
## 4 N102UW 25722
## 5 N103US 24619
## 6 N104UW 24616
## 7 N10575 139903
## 8 N105UW 23618
## 9 N107US 21677
## 10 N108UW 32070
## # ... with 4,027 more rows
Counts and Proportion of Logical Values: Podemos usar sums e means sobre vetores logicos para obter a quantidade e proporção em que a condição é atendida dado que TRUE = 1 e FALSE = 0
naocancelados %>% group_by(carrier) %>% summarise(voos= n(),atrasadostotal = sum(arr_delay >0),percentualatrasados = mean(arr_delay >0)) %>% arrange(percentualatrasados)
## # A tibble: 16 x 4
## carrier voos atrasadostotal percentualatrasados
## <chr> <int> <int> <dbl>
## 1 AS 709 189 0.267
## 2 HA 342 97 0.284
## 3 AA 31947 10706 0.335
## 4 VX 5116 1746 0.341
## 5 DL 47658 16413 0.344
## 6 OO 29 10 0.345
## 7 US 19831 7349 0.371
## 8 9E 17294 6637 0.384
## 9 UA 57782 22222 0.385
## 10 B6 54049 23609 0.437
## 11 WN 12044 5304 0.440
## 12 MQ 25037 11693 0.467
## 13 YV 544 258 0.474
## 14 EV 51108 24484 0.479
## 15 F9 681 392 0.576
## 16 FL 3175 1895 0.597
Quando agrupamos por múltiplas variáveis, cada sumario vai ser feito de uma camada do agrupamento. assim podemos subir progressivamente a análise caso desejado.
diario <- group_by(flights,year,month,day)
(por_dia <- summarise(diario,voos=n() ) )
## `summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.
## # A tibble: 365 x 4
## # Groups: year, month [12]
## year month day voos
## <int> <int> <int> <int>
## 1 2013 1 1 842
## 2 2013 1 2 943
## 3 2013 1 3 914
## 4 2013 1 4 915
## 5 2013 1 5 720
## 6 2013 1 6 832
## 7 2013 1 7 933
## 8 2013 1 8 899
## 9 2013 1 9 902
## 10 2013 1 10 932
## # ... with 355 more rows
(por_mes <- summarise(por_dia,voos=sum(voos)))
## `summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
## # A tibble: 12 x 3
## # Groups: year [1]
## year month voos
## <int> <int> <int>
## 1 2013 1 27004
## 2 2013 2 24951
## 3 2013 3 28834
## 4 2013 4 28330
## 5 2013 5 28796
## 6 2013 6 28243
## 7 2013 7 29425
## 8 2013 8 29327
## 9 2013 9 27574
## 10 2013 10 28889
## 11 2013 11 27268
## 12 2013 12 28135
(por_ano <- summarise(por_mes,voos=sum(voos)))
## # A tibble: 1 x 2
## year voos
## <int> <int>
## 1 2013 336776
Esse sistema de subir pelos agrupamentos é bom para somas e contagens porem quando estamos tratando de medias, variâncias e outras medidas estatísticas ele não deve ser usado sem cautela.
Se quisermos fazer a operação sem agrupamento o comando ungroup funciona.
diario %>% ungroup() %>% summarise(voos=n())
## # A tibble: 1 x 1
## voos
## <int>
## 1 336776
x <- naocancelados %>% count(dest)
naocancelados %>% count(tailnum, wt = distance)
## # A tibble: 4,037 x 2
## tailnum n
## <chr> <dbl>
## 1 D942DN 3418
## 2 N0EGMQ 239143
## 3 N10156 109664
## 4 N102UW 25722
## 5 N103US 24619
## 6 N104UW 24616
## 7 N10575 139903
## 8 N105UW 23618
## 9 N107US 21677
## 10 N108UW 32070
## # ... with 4,027 more rows
naocancelados %>% group_by(dest )%>% summarise(n())
## # A tibble: 104 x 2
## dest `n()`
## <chr> <int>
## 1 ABQ 254
## 2 ACK 264
## 3 ALB 418
## 4 ANC 8
## 5 ATL 16837
## 6 AUS 2411
## 7 AVL 261
## 8 BDL 412
## 9 BGR 358
## 10 BHM 269
## # ... with 94 more rows
naocancelados %>% group_by(tailnum) %>% summarise(distanciatot = sum(distance))
## # A tibble: 4,037 x 2
## tailnum distanciatot
## <chr> <dbl>
## 1 D942DN 3418
## 2 N0EGMQ 239143
## 3 N10156 109664
## 4 N102UW 25722
## 5 N103US 24619
## 6 N104UW 24616
## 7 N10575 139903
## 8 N105UW 23618
## 9 N107US 21677
## 10 N108UW 32070
## # ... with 4,027 more rows
Consideramos um voo que não chegou como cancelado, mesmo que ele tenha saído, Caso aconteça um pouso de emergência ou um acidente estariamos considerando esse voo como cancelado. A coluna mais importante entre essas duas seria a dep_time pois caso o avião saía, mesmo que mude de destino e/ou não chegue ele considera que o voo ocorreu.
voo_dia <- flights %>% group_by(year,month,day) %>%
summarise(previstos = n(),percentual_canc = mean(is.na(dep_time)),atrasomedio = mean(dep_delay,na.rm=T))
## `summarise()` has grouped output by 'year', 'month'. You can override using the `.groups` argument.
ggplot(voo_dia) +
geom_point(aes(x = atrasomedio , y=percentual_canc)) +
geom_smooth(aes(x=atrasomedio,y=percentual_canc),se=F) +
labs(title ='Percentual de voos cancelados em relação ao atraso médio dos voos que aconteceram',xlab='Atraso Médio',ylab='Percentual de cancelados')
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
É possível perceber uma correlação positiva entre o atraso médio dos voos e o percentual de cancelados.
naocancelados %>% group_by(carrier) %>% summarise(delay_med_saida = mean(dep_delay),delay_med_chegada = mean(arr_delay)) %>% mutate(total = (delay_med_saida + delay_med_chegada)/2) %>% arrange(total)
## # A tibble: 16 x 4
## carrier delay_med_saida delay_med_chegada total
## <chr> <dbl> <dbl> <dbl>
## 1 AS 5.83 -9.93 -2.05
## 2 HA 4.90 -6.92 -1.01
## 3 US 3.74 2.13 2.94
## 4 AA 8.57 0.364 4.47
## 5 DL 9.22 1.64 5.43
## 6 VX 12.8 1.76 7.26
## 7 UA 12.0 3.56 7.79
## 8 MQ 10.4 10.8 10.6
## 9 B6 13.0 9.46 11.2
## 10 9E 16.4 7.38 11.9
## 11 OO 12.6 11.9 12.3
## 12 WN 17.7 9.65 13.7
## 13 YV 18.9 15.6 17.2
## 14 EV 19.8 15.8 17.8
## 15 FL 18.6 20.1 19.4
## 16 F9 20.2 21.9 21.1
naocancelados %>% count(carrier,sort=T)
## # A tibble: 16 x 2
## carrier n
## <chr> <int>
## 1 UA 57782
## 2 B6 54049
## 3 EV 51108
## 4 DL 47658
## 5 AA 31947
## 6 MQ 25037
## 7 US 19831
## 8 9E 17294
## 9 WN 12044
## 10 VX 5116
## 11 FL 3175
## 12 AS 709
## 13 F9 681
## 14 YV 544
## 15 HA 342
## 16 OO 29
O argumento sort coloca os maiores valores do que foi contado em cima. Quando queremo saber os que mais vezes se repetem é útil.
Apesar de ser mais usado em sumários os agrupamentos tambem servem para mutates e filters.
Encontrar os piores membros de cada grupo.
flights_aux %>% group_by(year,month,day) %>% filter(rank(desc(arr_delay))<10)
## # A tibble: 3,306 x 7
## # Groups: year, month, day [365]
## year month day dep_delay arr_delay distance air_time
## <int> <int> <int> <dbl> <dbl> <dbl> <dbl>
## 1 2013 1 1 853 851 184 41
## 2 2013 1 1 290 338 1134 213
## 3 2013 1 1 260 263 266 46
## 4 2013 1 1 157 174 213 60
## 5 2013 1 1 216 222 708 121
## 6 2013 1 1 255 250 589 115
## 7 2013 1 1 285 246 1085 146
## 8 2013 1 1 192 191 199 44
## 9 2013 1 1 379 456 1092 222
## 10 2013 1 2 224 207 550 94
## # ... with 3,296 more rows
(popular_dest <- flights %>% group_by(dest) %>% filter(n()>15000))
## # A tibble: 66,180 x 19
## # Groups: dest [4]
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 554 600 -6 812 837
## 2 2013 1 1 554 558 -4 740 728
## 3 2013 1 1 558 600 -2 753 745
## 4 2013 1 1 558 600 -2 924 917
## 5 2013 1 1 559 559 0 702 706
## 6 2013 1 1 600 600 0 837 825
## 7 2013 1 1 606 610 -4 837 845
## 8 2013 1 1 608 600 8 807 735
## 9 2013 1 1 615 615 0 833 842
## 10 2013 1 1 628 630 -2 1016 947
## # ... with 66,170 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
Padronizar para encontrar métricas por grupo.
popular_dest %>% filter(arr_delay>0) %>% mutate(prop_delay=arr_delay/sum(arr_delay)) %>%
select(year:day,dest,arr_delay,prop_delay)
## # A tibble: 24,854 x 6
## # Groups: dest [4]
## year month day dest arr_delay prop_delay
## <int> <int> <int> <chr> <dbl> <dbl>
## 1 2013 1 1 ORD 12 0.0000424
## 2 2013 1 1 ORD 8 0.0000283
## 3 2013 1 1 LAX 7 0.0000344
## 4 2013 1 1 ATL 12 0.0000400
## 5 2013 1 1 ORD 32 0.000113
## 6 2013 1 1 LAX 29 0.000143
## 7 2013 1 1 ORD 14 0.0000495
## 8 2013 1 1 ORD 4 0.0000141
## 9 2013 1 1 ATL 5 0.0000167
## 10 2013 1 1 LAX 2 0.00000984
## # ... with 24,844 more rows
naocancelados %>% group_by(tailnum) %>% filter(n()>20) %>% summarise(prop = mean(arr_delay >0)) %>% mutate(rk= min_rank(desc(prop))) %>% arrange(rk)
## # A tibble: 3,120 x 3
## tailnum prop rk
## <chr> <dbl> <int>
## 1 N988AT 0.8 1
## 2 N983AT 0.75 2
## 3 N980AT 0.745 3
## 4 N969AT 0.735 4
## 5 N932AT 0.733 5
## 6 N149AT 0.727 6
## 7 N954AT 0.724 7
## 8 N265WN 0.72 8
## 9 N267AT 0.714 9
## 10 N353AT 0.714 9
## # ... with 3,110 more rows
naocancelados %>% group_by(hour) %>% summarise(media=mean(arr_delay)) %>% mutate(rank= min_rank(media)) %>% arrange(rank)
## # A tibble: 19 x 3
## hour media rank
## <dbl> <dbl> <int>
## 1 7 -5.30 1
## 2 5 -4.80 2
## 3 6 -3.38 3
## 4 9 -1.45 4
## 5 8 -1.11 5
## 6 10 0.954 6
## 7 11 1.48 7
## 8 12 3.49 8
## 9 13 6.54 9
## 10 14 9.20 10
## 11 23 11.8 11
## 12 15 12.3 12
## 13 16 12.6 13
## 14 18 14.8 14
## 15 22 16.0 15
## 16 17 16.0 16
## 17 19 16.7 17
## 18 20 16.7 18
## 19 21 18.4 19
Voce deve voar as 7 da manhã, mas como caso geral, mais cedo costuma ser menos atrasado.
naocancelados %>% filter(arr_delay >0) %>% group_by(dest) %>% mutate(total=sum(arr_delay),prop = arr_delay/total) %>% select(dest,month,day,dep_time,carrier,flight,arr_delay,prop) %>% arrange(dest,desc(prop))
## # A tibble: 133,004 x 8
## # Groups: dest [103]
## dest month day dep_time carrier flight arr_delay prop
## <chr> <int> <int> <int> <chr> <int> <dbl> <dbl>
## 1 ABQ 7 22 2145 B6 1505 153 0.0341
## 2 ABQ 12 14 2223 B6 65 149 0.0332
## 3 ABQ 10 15 2146 B6 65 138 0.0308
## 4 ABQ 7 23 2206 B6 1505 137 0.0305
## 5 ABQ 12 17 2220 B6 65 136 0.0303
## 6 ABQ 7 10 2025 B6 1505 126 0.0281
## 7 ABQ 7 30 2212 B6 1505 118 0.0263
## 8 ABQ 7 28 2038 B6 1505 117 0.0261
## 9 ABQ 12 8 2049 B6 65 114 0.0254
## 10 ABQ 9 2 2212 B6 1505 109 0.0243
## # ... with 132,994 more rows
gr <- naocancelados %>% arrange(origin,month,day,dep_time) %>% group_by(origin) %>% mutate(dep_lag_delay = lag(dep_delay)) %>% filter(!is.na(dep_delay),!is.na(dep_lag_delay))
Agora podemos fazer um gráfico considerando agrupando os voos que tiveram atraso do voo anterior igual.
gr %>% group_by(origin,dep_lag_delay) %>% summarise(dep_delay_mean= mean(dep_delay)) %>% ggplot() + geom_point(aes(x=dep_lag_delay,y=dep_delay_mean)) + facet_wrap(~origin)
## `summarise()` has grouped output by 'origin'. You can override using the `.groups` argument.
A tendencia é de que quando um voo anterior está atrasado o proximo tambem esteja.
naocancelados %>% group_by(origin,dest) %>% mutate(media=mean(air_time),desvio= sd(air_time)) %>% filter(air_time < media - 3*desvio)
## # A tibble: 23 x 21
## # Groups: origin, dest [19]
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 12 1559 1600 -1 1849 1917
## 2 2013 1 25 1954 2000 -6 2131 2114
## 3 2013 10 8 1218 1207 11 1330 1320
## 4 2013 11 3 1720 1645 35 1820 1820
## 5 2013 11 10 2307 2250 17 34 8
## 6 2013 3 2 1450 1500 -10 1547 1608
## 7 2013 3 15 908 830 38 1004 944
## 8 2013 3 23 1914 1910 4 2045 2043
## 9 2013 3 25 2340 2250 50 120 5
## 10 2013 4 28 1557 1610 -13 1723 1755
## # ... with 13 more rows, and 13 more variables: arr_delay <dbl>, carrier <chr>,
## # flight <int>, tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
## # distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>, media <dbl>,
## # desvio <dbl>
Voos 3 desvios padrão fora da média daquela rota.
naocancelados %>% group_by(dest) %>% mutate(ncar = n_distinct(carrier)) %>% filter(ncar>1) %>% ungroup() %>% group_by(carrier) %>% summarise(ndes= n_distinct(dest)) %>% arrange(desc(ndes))
## # A tibble: 16 x 2
## carrier ndes
## <chr> <int>
## 1 EV 50
## 2 9E 47
## 3 UA 42
## 4 DL 39
## 5 B6 35
## 6 AA 19
## 7 MQ 19
## 8 WN 10
## 9 OO 5
## 10 US 5
## 11 VX 4
## 12 YV 3
## 13 FL 2
## 14 AS 1
## 15 F9 1
## 16 HA 1
A companhia EV é a que voa para mais destinos voados por duas companhias.
naocancelados %>% select(tailnum,dep_delay,month,day) %>% arrange(tailnum,month,day) %>% group_by(tailnum) %>%
mutate(cum = cumsum(dep_delay>60)) %>% summarise(total=sum(cum <1)) %>% arrange(total)
## # A tibble: 4,037 x 2
## tailnum total
## <chr> <int>
## 1 D942DN 0
## 2 N10575 0
## 3 N11106 0
## 4 N11109 0
## 5 N11187 0
## 6 N11199 0
## 7 N12967 0
## 8 N13550 0
## 9 N136DL 0
## 10 N13903 0
## # ... with 4,027 more rows